package io.github.hadyang.leetcode.random;

import io.github.hadyang.leetcode.ListNode;
import org.junit.Test;

/**
 * 给定一个链表，判断链表中是否有环。
 *
 * <p>为了表示给定链表中的环，我们使用整数 pos 来表示链表尾连接到链表中的位置（索引从 0 开始）。 如果 pos 是 -1，则在该链表中没有环。
 *
 * <p>来源：力扣（LeetCode） 链接：https://leetcode-cn.com/problems/linked-list-cycle
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class Q141 {

  public boolean hasCycle(ListNode head) {
    if (head == null || head.next == null) return false;

    ListNode slow = head;
    ListNode fast = head;

    while (fast != null) {
      slow = slow.next;

      if (fast.next == null) return false;
      fast = fast.next.next;

      if (slow == fast) return true;
    }

    return false;
  }

  @Test
  public void test() {
    ListNode node1 = new ListNode(3);
    ListNode node2 = new ListNode(2);
    ListNode node3 = new ListNode(0);
    ListNode node4 = new ListNode(4);

    node1.next = node2;
    node2.next = node3;
    node3.next = node4;
    node4.next = node2;
    System.out.println(hasCycle(node1));
  }
}
